// call() 方法在使用一个指定的 this 值和若干个指定的参数值的前提下调用某个函数或方法。
// 1.this 参数可以传 null，当为 null 的时候，视为指向 window
// 2.函数是可以有返回值的！

// 例子
// var foo = {
//   value: 1
// };

// function bar() {
//   console.log(this.value);
// }

// bar.call(foo); // 1

// 注意两点：

// 1. call 改变了 this 的指向，指向到 foo
// 2. bar 函数执行了

// 所以我们模拟的步骤可以分为：

// 1. 将函数设为对象的属性
// 2. 执行该函数
// 3. 删除该函数

Function.prototype.call2 = function(context=window, ...rest){
  // bar.call(foo);
  // bar调用的call,所以this是bar
  context['fn'] = this
  const result = context.fn(...rest)
  delete context.fn

  return result
}